function output = custom_conv1d(signal, kernel)
    % 获取信号和核的大小
    signal_length = length(signal);
    kernel_length = length(kernel);
    % 计算输出信号的长度，不包含任何填充
    output_length = signal_length + kernel_length - 1;
    % 为了使用FFT，我们需要将信号和核填充到至少为信号长度和核长度之和
    padded_length = output_length;
    % 填充信号和核
    padded_signal = [signal, zeros(1, padded_length - signal_length)];
    padded_kernel = [kernel, zeros(1, padded_length - kernel_length)];
    % 使用FFT将信号和核转换到频域
    signal_fft = fft(padded_signal);
    kernel_fft = fft(padded_kernel);
    % 在频域中进行乘法操作
    result_fft = signal_fft .* kernel_fft;
    % 使用IFFT将结果转换回时域
    result = ifft(result_fft);
    % 取实部，因为FFT/IFFT可能会引入微小的虚部
    result = real(result);
    % 截取有效的输出部分
    output = result(1:output_length);
end
function delta = delta_function(N, pos)
    % N: 序列的正半轴长度（负半轴对称）
    % pos: 冲击序列为 1 的位置（从 -N 到 N 的索引）
    % 构建长度为 2N+1 的向量，初始化为 0
    delta = zeros(1, 2*N+1);
    % 将 pos 调整到向量索引范围内
    % pos 可能为负数，我们需要将它转换为从 1 到 2N+1 的索引
    delta(N + pos + 1) = 1; % +1 是因为 MATLAB 的索引从 1 开始
end
% 主脚本部分
% 定义冲击序列长度 N
N = 10;
% 初始化 x(n) 为零向量
x_n = zeros(1, 2*N + 1);
% 计算 x(n)
x_n = x_n + delta_function(N, 0);   % δ(n)
x_n = x_n + 2 * delta_function(N, 1); % 2δ(n-1)
x_n = x_n + 3 * delta_function(N, 2); % 3δ(n-2)
x_n = x_n + 4 * delta_function(N, 3); % 4δ(n-3)
x_n = x_n + 5 * delta_function(N, 4); % 5δ(n-4)
% 初始化 h(n) 为零向量
h_n = zeros(1, 2*N + 1);
% 计算 h(n)
h_n = h_n + delta_function(N, 0);     % δ(n)
h_n = h_n + 2 * delta_function(N, 1); % 2δ(n-1)
h_n = h_n + delta_function(N, 2);     % δ(n-2)
h_n = h_n + delta_function(N, 3);     % δ(n-3)
% 计算信号的卷积
conv_n = custom_conv1d(x_n, h_n);
% 创建 n 的索引
n_x = -N:N; % x(n) 的索引
n_h = -N:N; % h(n) 的索引
n_conv = -(2*N):2*N; % 卷积的索引
% 绘制原序列 x(n)
figure; % 创建新图形窗口
subplot(3, 1, 1); % 创建 3 行 1 列的子图，第 1 个子图
stem(n_x, x_n, 'filled', 'LineWidth', 1.5);
title('Discrete Signal x(n)');
xlabel('n');
ylabel('Amplitude');
grid on; % 显示网格
% 绘制序列 h(n)
subplot(3, 1, 2); % 创建 3 行 1 列的子图，第 2 个子图
stem(n_h, h_n, 'filled', 'LineWidth', 1.5);
title('Discrete Signal h(n)');
xlabel('n');
ylabel('Amplitude');
grid on; % 显示网格
% 绘制信号的卷积
subplot(3, 1, 3); % 创建 3 行 1 列的子图，第 3 个子图
stem(n_conv, conv_n, 'filled', 'LineWidth', 1.5);
title('Convolution of x(n) and h(n)');
xlabel('n');
ylabel('Amplitude');
grid on; % 显示网格
